package com.hqyj.javaSpringBoot.modules.common.service.impl;

import com.hqyj.javaSpringBoot.modules.common.entiy.ImageType;
import com.hqyj.javaSpringBoot.modules.common.entiy.ResourceConfigBean;
import com.hqyj.javaSpringBoot.modules.common.entiy.ResultEntity;
import com.hqyj.javaSpringBoot.modules.common.service.ImageService;
import com.hqyj.javaSpringBoot.util.FileUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Service
public class ImageServiceImpl implements ImageService {

    private final static Logger LOGGER = LoggerFactory.getLogger(ImageServiceImpl.class);
    @Autowired
    private ResourceConfigBean resourceConfigBean;

    /**
     * file必须和前端的input [type=file]标签的名称相同
     * @param file
     * @param imageType
     * @return
     */
    @Override
    public ResultEntity<String> uploadImage(MultipartFile file, String imageType) {
        //判断文件是否选中上传
        if (file.isEmpty()) {
            return new ResultEntity<>(
                    ResultEntity.ResultStatus.FAILED.code, "File is empty");
        }

        //通过ResourceConfigBean获取window的绝对路径，并以imageType类型作为文件夹名称
        String destFolderString = String.format("%s%s",
                resourceConfigBean.getLocalPathForWindow(), imageType);
        //查看destFolderString是否存在，不存在则创建
        File destFolder = new File(destFolderString);
        if (!destFolder.exists()) {
            destFolder.mkdir();
        }

        //imageName通过获取当前的时间，拼接文件的格式，作为上传图片的名称
        //abstactPath绝对路径
        //返回给项目的相对路径relativePath，页面可以通过该相对路径找到文件的位置并呈现
        String imageName = String.format("%s.%s",
                System.currentTimeMillis(),
                FileUtil.getFileType(file.getOriginalFilename()));
        String abstactPath = String.format("%s/%s",
                destFolderString, imageName);
        String relativePath = String.format("%s%s/%s",
                resourceConfigBean.getResourcePath(), imageType, imageName);

        try {
            //上传文件到指定的绝对路径
            File destFile = new File(abstactPath);
            file.transferTo(destFile);
            //三目表达式给文件的类型进行判断，如果上传的文件有指定文件类型则，选用自带的，
            // 如果上传的文件没有指定文件类型，则默认ImageType.PROFILE_BIG的参数
            ImageType type = ImageType.getImageTypeByName(imageType) == null ?
                    ImageType.PROFILE_BIG : ImageType.getImageTypeByName(imageType);
            //对上传的文件进行，大小格式的转换
            FileUtil.changeImageSize(abstactPath, abstactPath, type.width, type.height);
        } catch (IOException e) {
            e.printStackTrace();
            LOGGER.debug(e.getMessage());
            return new ResultEntity<>(
                    ResultEntity.ResultStatus.FAILED.code, "Upload Image failed.");
        }

        return new ResultEntity<>(
                ResultEntity.ResultStatus.SUCCESS.code, "Upload Image success.", relativePath);
    }
}
